package com.anxpp.calculator.bio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *   final修饰类表示这个类不能继承
 *   BIO服务器端源码
 *   @author lijun
 *   @version 1.0
 */
public final class ServerBetter {
    //默认的端口号
    private static int DEFAULT_PORT = 12345;
    //单例的ServerSocket
    private static ServerSocket server;
    //线程池--懒汉式的单例
    private static ExecutorService executorService = Executors.newFixedThreadPool(2);

    //根据传入参数设置监听端口，如果没有参数调用以下方法并使用默认值
    public static void start() throws IOException{
        //使用默认值
        start(DEFAULT_PORT);
    }

    //这个方法不会被大量并发访问，不太需要考虑效率，直接进行方法同步就行了
    private synchronized static void start(int port) throws IOException{
        if(server != null) return;
        try{
            //构造函数创建ServerSocket
            //如果端口合法且空闲，服务端就监听成功
            server = new ServerSocket(port);
            System.out.println("服务器已启动，端口号：" + port);
            System.out.println("------------------------------------");
            Socket socket;
            //通过无限循环监听客户端连接
            //如果没有客户端接入，将阻塞在accept操作上
            while(true){
                socket = server.accept();
                //当有新的客户端接入时，执行下面的代码
                //然后创建一个新的线程处理这条socket链路
                executorService.execute(new ServerHandler(socket));
            }
        }finally{
            //一些必要的清理工作
            if(server != null){
                System.out.println("服务器已关闭。");
                executorService.shutdown();
                server.close();
                server = null;
                System.out.println("------------------------------------");
            }
        }

    }

    public static void main(String[] args) throws IOException {
//        ServerBetter.start();
        start();
    }



}

